package eu.epfc.dnet.mastermind.services;

import eu.epfc.dnet.mastermind.hibernate.*;
import eu.epfc.dnet.mastermind.model.beans.GameBean;
import eu.epfc.dnet.mastermind.model.beans.User;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;

/**
 *
 * @author Pierre Buvé & Nicolas Van Damme
 */
@Service
public class UserManager {

    TusersHelper tusersHelper;
    TgamesHelper tgamesHelper;
    TlinesHelper tlinesHelper;
    String guestUserName = "guest";

    /**
     * Retourne les infos de l'utilisateur désigné par défaut.
     *
     * @return
     */
    public User getGuestUser() {
        tusersHelper = new TusersHelper();
        Tusers tusers = tusersHelper.getUserByUsername(guestUserName);
        User user = new User(tusers.getUsername(), tusers.getPassword(), tusers.getEmail(), tusers.getRegistrationDate());
        return user;
    }

    /**
     * Retourne les infos de l'utilisateur d'apres son username.
     *
     * @param username
     * @return
     */
    public User getUserByUsername(String username) {
        tusersHelper = new TusersHelper();
        Tusers tusers = tusersHelper.getUserByUsername(username);
        User user = new User(tusers.getUsername(), tusers.getPassword(), tusers.getEmail(), tusers.getRegistrationDate());
        return user;
    }

    /**
     * Insere un nouvel utilisateur dans la base de données.
     *
     * @param user
     */
    public void insertNewUser(User user) {
        System.out.println(user);
        Tusers tusers = new Tusers();
        tusers.setUsername(user.getUsername());
        tusers.setPassword(user.getPassword());
        tusers.setEmail(user.getEmail());
        tusers.setRegistrationDate(new Date());
        tusersHelper = new TusersHelper();
        tusersHelper.insertNewUser(tusers);
    }

    /**
     * Retourne true si l'username se trouve dans la base de données.
     *
     * @param username
     * @return
     */
    public Boolean isUsernameInDatabase(String username) {
        tusersHelper = new TusersHelper();
        return tusersHelper.isUsernameInDatabase(username);
    }

    /**
     * Retourne true si l'email se trouve dans la base de données.
     *
     * @param email
     * @return
     */
    public Boolean isEmailInDatabase(String email) {
        tusersHelper = new TusersHelper();
        return tusersHelper.isEmailInDatabase(email);
    }

    /**
     * Retourne true si le mot de passe est ok.
     *
     * @param user
     * @return
     */
    public Boolean isPasswordOK(User user) {
        tusersHelper = new TusersHelper();
        Tusers tusers = tusersHelper.getUserByUsername(user.getUsername());
        return user.getPassword().equals(tusers.getPassword());
    }

    /**
     * Retourne la liste des parties de l'utilisateur selon le statut recu en
     * paramètre.
     *
     * @param username
     * @param status
     * @return
     */
    public List<GameBean> getGameListForUserByStatus(String username, String status) {
        tgamesHelper = new TgamesHelper();

        // va d'abord chercher la liste des games pour un user
        List<Tgames> listTgames = tgamesHelper.getGameListForUserByStatus(username, status);

        // peuple la liste de gameBean
        List<GameBean> listGameBean = new ArrayList<GameBean>();
        for (int i = 0; i < listTgames.size(); i++) {
            GameBean gameBean = new GameBean();
            gameBean.setCreationDate(listTgames.get(i).getCreationDate());
            gameBean.setDuration(listTgames.get(i).getDuration());
            gameBean.setId(listTgames.get(i).getId());
            gameBean.setSol01(listTgames.get(i).getSol01());
            gameBean.setSol02(listTgames.get(i).getSol02());
            gameBean.setSol03(listTgames.get(i).getSol03());
            gameBean.setSol04(listTgames.get(i).getSol04());
            listGameBean.add(gameBean);
        }

        // Ajoute a la liste l ligne courante pour chaque partie
        for (int j = 0; j < listGameBean.size(); j++) {
            tlinesHelper = new TlinesHelper();
            int currentTurn = tlinesHelper.getCurrentTurnForGameId(listGameBean.get(j).getId());
            listGameBean.get(j).setCurrentLine(currentTurn + 1);
        }

        return listGameBean;

    }

    /**
     * Retourne le nombre de fois qu'un utilisateur a utilisé une couleur recue
     * en paramètre
     *
     * @param login
     * @param color
     * @return
     */
    public int getNbrColorUsedForUser(String login, String color) {
        tlinesHelper = new TlinesHelper();
        return tlinesHelper.getNbrColorUsedForUser(login, color);
    }
}
